#pragma once
#include <compl.h>


/* 一张表用于记录周期, 定长周期有上限 */
typedef word_t cycrec_t;

/* 记录 */
SAI void __cycrec_record(cycrec_t *cycrec, word_t cycle, const word_t max_cycle, const word_t intv){
	if (cycle >= max_cycle) cycle = max_cycle - 1;
	word_t intv_idx = cycle/intv;
	cycrec[intv_idx] += 1;
}
/* 两线程的cycrec合并 cyc0 = cyc1 + cyc2 */
SAI void __cycrec_merge(cycrec_t *cyc0, cycrec_t *cyc1, cycrec_t *cyc2, const word_t max_cycle, const word_t intv){
	word_t intv_maxidx = max_cycle/intv;
	for (word_t idx = 0; idx < intv_maxidx; idx++){
		cyc0[idx] = cyc1[idx] + cyc2[idx];
	}
}

#define CYCREC_FOREACH(cycrec, dosth) do{\
	for(word_t idx = 0; idx < sizeof(cycrec) / sizeof(cycrec_t); idx++){\
		word_t x = cycrec.c[idx];\
		dosth(idx, x);\
	}\
}while(0)

/* 传入一个初始化 */
#define NEW_CYCREC(name, CYCREC_MAXCYCLE, CYCREC_INTV) \
typedef struct cycrec_##name {\
	cycrec_t c[CYCREC_MAXCYCLE/CYCREC_INTV];\
} cycrec_##name##_t;\
SAI cycrec_##name##_t *cycrec_init_##name(void *ptr, size_t size){\
	if (size < sizeof(cycrec_##name##_t)) return NULL;\
	return (cycrec_##name##_t *)ptr;\
}\
SAI void cycrec_record_##name(cycrec_##name##_t *cycrec, word_t cycle){\
	__cycrec_record(cycrec->c, cycle, CYCREC_MAXCYCLE, CYCREC_INTV);\
}\
SAI void cycrec_merge_##name(cycrec_##name##_t *cyc0, cycrec_##name##_t *cyc1, cycrec_##name##_t *cyc2){\
	__cycrec_merge(cyc0->c, cyc1->c, cyc2->c, CYCREC_MAXCYCLE, CYCREC_INTV);\
}



/* 计算百分位数 */